/*
在多人聊天中，舍弃了群的概念，添加了聊天会话的概念，因为会话既可以是两人
单聊会话，也可以是多人聊天会话，这样就可以统一管理了。
包含字段：
• ID：作为主键
• 会话 ID：会话标识
• 会话名称： 单聊会话则设置为'单聊会话'或直接为空就行，因为单聊会话名称
就是对方名称，头像就是对方头像
• 会话类型： SINGLE-单聊 / GROUP-多人（单聊由服务器在同意好友时创建，
多人由用户申请创建）
提供的操作
*/

#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>
#include <boost/date_time/posix_time/posix_time.hpp>
#include "chat_session_member.hxx"

namespace zrb 
{
    enum class ChatSessionType 
    {
        SINGLE = 1,
        GROUP = 2
    };

    #pragma db object table("chat_session")
    class Chat_Session
    {
    public:
        Chat_Session()
        {}

        Chat_Session(const std::string& session_id,
            const std::string& chat_session_name,
            ChatSessionType chat_session_type)
            :_session_id(session_id)
            ,_chat_session_name(chat_session_name)
            ,_chat_session_type(chat_session_type)
        {}

        std::string session_id()
        {
            return _session_id;
        }
        void session_id(const std::string& val)
        {
            _session_id = val;
        }

        std::string chat_session_name()
        {
            return _chat_session_name;
        }
        void chat_session_name(const std::string& val)
        {
            _chat_session_name= val;
        }

        ChatSessionType chat_session_type()
        {
            return _chat_session_type;
        }
        void chat_session_type(ChatSessionType val)
        {
            _chat_session_type = val;
        }
    
    private:
        friend class odb::access;
        #pragma db id auto //主键自增
        unsigned long _id;
        #pragma db type("varchar(64)") index unique //建立索引
        std::string _session_id; //会话id
        #pragma db type("varchar(64)") 
        std::string _chat_session_name;
        #pragma db type("tinyint") 
        ChatSessionType _chat_session_type; //1-单聊 2-群聊
    };

    //css::chat_session_type==1表示是单聊
    //csm1.user_id=uid表示是自己的ID
    //csm2.user_id != csm1.user_id 找到单聊会话的好友ID
    // 这里条件必须是指定条件：  css::chat_session_type==1 && csm1.user_id=uid && csm2.user_id != csm1.user_id
    #pragma db view object(Chat_Session = css)\
                    object(Session_member = csm1 : css::_session_id == csm1::_session_id)\
                    object(Session_member = csm2 : css::_session_id == csm2::_session_id)\
                    query((?))
    struct SingleChatSession {
        #pragma db column(css::_session_id)
        std::string chat_session_id;
        #pragma db column(csm2::_user_id)
        std::string friend_id;
    };

    //css::chat_session_type==2表示是群聊
    //csm.user_id=uid表示必须是自己的群聊
    //这里条件必须是指定条件：css::chat_session_type==2 && csm.user_id=uid
    #pragma db view object(Chat_Session = css)\
                    object(Session_member = csm : css::_session_id == csm::_session_id)\
                    query((?))
    struct GroupChatSession {
        #pragma db column(css::_session_id)
        std::string chat_session_id;
        #pragma db column(css::_chat_session_name)
        std::string chat_session_name;
    };
}



